数据结构 字符串比较 KMP算法

KMP算法:最简单的字符串匹配算法由于需要回溯查找,时间复杂度大。而改进型的KMP算法充分利用字符串的特性,减少了主字符串回溯需要查找的时间,大大的降低了其复杂度,大小为O(n+m),n为主字符串长度,m为从字符串长度。

   下面介绍下KMP算法的步骤:

     主字符串:aabbdcacaabca     从字符串:aabca

      首先要设定指向主和从的指针i,j.KMP算法规定主指针不能回头,即网前移动后不能倒回去寻找匹配字符,那么就根据这个规定我们看下有什么变化和要求。

1.首先aabbdcacaabca的第一位和aabca的第一位比较,如果相等ij都跳到下一位比较,如果不等,i不变j调到前一位比较直到找到相等的。

i=1

 

 

 

 

 

 

 

 

 

 

 

 

a

a

b

b

d

c

a

c

a

a

b

c

a

a

 

 

 

 

 

 

 

 

 

 

 

 

j=1

 

 

 

 

 

 

 

 

 

 

 

 

 

2.同步骤1,比较了i=2i=3

 

 

i=3

 

 

 

 

 

 

 

 

 

 

a

a

b

b

d

c

a

c

a

a

b

c

a

a

a

b

 

 

 

 

 

 

 

 

 

 

 

 

j=3

 

 

 

 

 

 

 

 

 

 

3.i=3时发现c!=b,这时让从串回溯,看3.1后的演示:

 

 

 

i=4

 

 

 

 

 

 

 

 

 

a

a

b

b

d

c

a

c

a

a

b

c

a

a

a

b

c!=b

 

 

 

 

 

 

 

 

 

 

 

 

j=4

 

 

 

 

 

 

 

 

 

3.1由于i不能动,现在我们也不知道j应该在哪个值可行,那只有一个一个试。

   考虑从j-1位置依次往从字符串首靠比较合理。发先j=2处,a != b,因为只要一个不

   匹配,说明主串对应的段绝对不会与字串匹配。因此移动j-1位继续移动。

 

 

 

i=4

 

 

 

 

 

 

 

 

 

a

a

b

b

d

c

a

c

a

a

b

c

a

 

a

a

b

 

 

 

 

 

 

 

 

 

 

 

 

j=3

 

 

 

 

 

 

 

 

 

3.2这时j=2,发现也不匹配。

 

 

 

i=4

 

 

 

 

 

 

 

 

 

a

a

b

b

d

c

a

c

a

a

b

c

a

 

 

a

a

 

 

 

 

 

 

 

 

 

 

 

 

j=2

 

 

 

 

 

 

 

 

 

3.3这时j=1,发现也不匹配,现在的从串数据都比较完了,

  那么这时ij都跳到下一位比较。

 

 

 

i=4

 

 

 

 

 

 

 

 

 

a

a

b

b

d

c

a

c

a

a

b

c

a

 

 

 

a

 

 

 

 

 

 

 

 

 

 

 

 

j=1

 

 

 

 

 

 

 

 

 

 

4这时两者有从头开始比较

 

 

 

 

i=5

 

 

 

 

 

 

 

 

a

a

b

b

d

c

a

c

a

a

b

c

a

 

 

 

 

a

 

 

 

 

 

 

 

 

 

 

 

 

j=1

 

 

 

 

 

 

 

 

从上面3发现 c!=b后,有没有未卜先知的功能让从字符串的比较一下子

跳到步骤4,而省去3.13.23.3这样的累赘,不就轻松很多。呵呵,

(^_^)我们的大师K,MP就想出了省力讨好偷懒的办法

这个值怎么算到让j一下子跳到哪个位置还是有点复杂。

1.       首先规定第一个位置为00代表的意思是在这个位置的从字符和主字符串都

不匹配,两者都跳到下一个位置达到从来!比如从字符串的第一个a,如果主不是的a话那么他们都跳到下一个位置比较。

next大于0时,它的意义就是,主字符串的指针不变,从的字符串调到对应的next值位与主字符串现在的位置做比较。比如主是aadcef,从是aabca, 从的next值是aabca.其中从b的对应next值为2,也就是说当比较到b这位不匹配时,从应回溯到从2对应的位置上与主进行比较,即从的第二个a上面。

b

 

 

 

 

a

a

b

c

a

 

1

 

 

 

 

next

0

 

 

 

 

2.       1位匹配,假如第2位不匹配时,发现第1a

2a一样的值,那么next也一样。

a

b

 

 

 

a

a

b

c

a

 

 

2

 

 

 

next

0

0

 

 

 

3.       如果第3位不匹配,因为2位和3位不一样,当3不行的时候,可以把

2位移过来,且第1位与主字符串完全匹配。

a

a

c

 

 

a

a

b

c

a

 

 

 

3

 

 

next

0

0

2

 

 

4.4位不匹配时,同上可得。

a

a

b

b

 

a

a

b

c

a

 

 

 

 

4

 

next

0

0

2

1

 

5.5位不匹配时,按同样的方法。

a

a

b

c

c

a

a

b

c

a

 

 

 

 

 

5

next

0

0

2

1

0

说个一般性规律,还真不好说,我现在只是意会到了,言传太难了!!!

详细请看源代码:

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值